package br.edu.ifrn.view;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.richfaces.exception.FileUploadException;

import br.edu.ifrn.controller.CategoriaUsuarioEJBLocal;
import br.edu.ifrn.controller.DocumentoEJB;
import br.edu.ifrn.controller.DocumentoEJBLocal;
import br.edu.ifrn.controller.TipoDocumentoEJBLocal;
import br.edu.ifrn.dao.DocumentoDAO;
import br.edu.ifrn.exeption.CategoriaUsuarioException;
import br.edu.ifrn.model.CategoriaUsuario;
import br.edu.ifrn.model.ClasseDocumento;
import br.edu.ifrn.model.Documento;
import br.edu.ifrn.model.TipoDocumento;

@ManagedBean
@ViewScoped
public class BuscaMBean {
	
	private String busca;
	private List<Documento> listaDocumento; 	  
	private String tipo;
	private String classe;
	private SelectItem buscaValorPadrao;
	TipoDocumento t ;
	private StreamedContent fileDownload;
	private Documento documento;


	public BuscaMBean() {		
		busca = new String();		
		tipo= "Todos";
		classe = "Todos";
		t = new TipoDocumento();
		t.setDescricao("Todos");
		t.setId(new Long(11));		
		//tipos.put("teste", "teste");
		//tipos.put("teste2", "teste2");
		//tipos.put("teste3", "teste3");
	}
	
	@EJB
	private DocumentoEJBLocal documentoEJB;
	
	
	@PostConstruct
    public void construct() {
		buscaValorPadrao = new SelectItem(t,"Todos");
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		busca = (String) session.getAttribute("busca");
		actionBuscar();
    }
	
	public String getClasse() {  
        return classe;  
    }  
    public void setClasse(String classe) {  
        this.classe = classe;  
    } 
	
	public String getTipo() {  
        return tipo;  
    }  
    public void setTipo(String tipo) {  
        this.tipo = tipo;  
    } 
    
    public Documento getDocumento() {
		return documento;
	}

	public void setDocumento(Documento documento) {
		this.documento = documento;
	}
	
	public String index() {
		return "/busca/busca.xhtml";
	}
	
	public List<Documento> getListaDocumento(){
		return listaDocumento;
	}

	public String getBusca() {
		return busca;
	}
	
	public Documento findDocumento(Long id) {
		return documentoEJB.find(id);
	}
	
	public void setBusca(String busca) {
		this.busca = busca;
	}
	
	public String actionBuscar() {
		try {
			List<Documento> lista = documentoEJB.buscar(busca, tipo, classe);
			listaDocumento = new ArrayList<Documento>();
			for (Documento documento : lista) {
				if(!documento.isDescartado())
					listaDocumento.add(documento);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return index();
	}
	
	public void actionLimpar() {
		busca = new String();
	}
	
	public StreamedContent getFileDownload() {
		return fileDownload;
	}

	public void setFileDownload(StreamedContent fileDownload) {
		this.fileDownload = fileDownload;
	}
	
	public void actionDownload(){
		try {
			String path = ((ServletContext)FacesContext.getCurrentInstance().
					getExternalContext().getContext()).getRealPath("/");
			FileOutputStream os = new FileOutputStream(path + documento.getArquivo().getNome());
			os.write(documento.getArquivo().getConteudo());
			os.flush();
			
			InputStream stream = new FileInputStream(path + documento.getArquivo().getNome());
			fileDownload = new DefaultStreamedContent(stream, "" , documento.getArquivo().getNome());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public SelectItem getBuscaValorPadrao() {
		return buscaValorPadrao;
	}

	public void setBuscaValorPadrao(SelectItem buscaValorPadrao) {
		this.buscaValorPadrao = buscaValorPadrao;
	}
	
}
